#ifndef CALC_SYSTEM_HPP
#define CALC_SYSTEM_HPP
#include "creature.hpp"

struct CreatureProperties;

enum class DmgState{
    NORMAL,         // 正常攻击
    CRITICAL_ATTACK,// 暴击
    CRITICAL_FAULT  // 致命失误
};

/* @brief 对生物的伤害计算，由p1攻击p2 
 *
 * 具体的计算方法如下：
 *  1. 首先系统丢出一个D20骰子,产生一个1~20的随机数n
 *  2. 将p1的attack属性加上n, s=p1.attack+n
 *  3. 如果s>p2.defence，则可以击中。否则不能击中，基于伤害为0
 *  4. 如果可以给予伤害，则计算p1.strength+[武器伤害]的总伤害damage
 *  5. 如果n=20代表暴击，给予对方翻倍的伤害2*damage。如果n=1，代表致命失误，即使s>p2.defence也不能给予伤害
 *
 * @params p1 给予伤害的一方
 *         p2 接收伤害的一方
 *         state 返回值参数，返回伤害的结果
 * @return 返回给与的伤害值
 */
int CalcDamage(CreatureProperties& p1, CreatureProperties& p2, DmgState& state);

#endif

